const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

// 是否启用测试模式（不需要权限检查）
const TEST_MODE = false; // 禁用测试模式，正常检查权限

/**
 * 验证用户是否有指定权限
 * @param {string|string[]} requiredPermissions - 需要的权限代码或权限代码数组
 * @returns {Function} Express中间件
 */
exports.hasPermission = (requiredPermissions) => {
  return async (req, res, next) => {
    try {
      console.log('权限检查中间件 - 所需权限:', requiredPermissions);
      
      // 测试模式：跳过权限检查
      if (TEST_MODE) {
        console.log('测试模式: 跳过权限检查');
        return next();
      }
      
      // 获取用户ID
      const userId = req.user?.id;
      
      if (!userId) {
        return res.status(401).json({
          status: 'error',
          message: '未认证的用户'
        });
      }
      
      // 查询用户及其角色和权限
      const user = await prisma.user.findUnique({
        where: { id: userId },
        include: {
          role: {
            include: {
              permissions: {
                include: {
                  permission: true
                }
              }
            }
          }
        }
      });
      
      if (!user) {
        return res.status(404).json({
          status: 'error',
          message: '用户不存在'
        });
      }
      
      // 判断用户状态
      if (!user.status) {
        return res.status(403).json({
          status: 'error',
          message: '用户已被禁用'
        });
      }
      
      // 获取用户权限代码
      const userPermissions = user.role?.permissions.map(p => p.permission.code) || [];
      console.log('用户权限:', userPermissions);
      
      // 将单个权限代码转换为数组
      const permissions = Array.isArray(requiredPermissions)
        ? requiredPermissions
        : [requiredPermissions];
      
      // 检查用户是否拥有任一所需权限
      const hasRequiredPermission = permissions.some(
        permission => userPermissions.includes(permission) || userPermissions.includes('*')
      );
      
      if (!hasRequiredPermission) {
        return res.status(403).json({
          status: 'error',
          message: '没有权限执行此操作'
        });
      }
      
      // 将用户权限添加到请求对象中，以便后续使用
      req.permissions = userPermissions;
      
      next();
    } catch (error) {
      console.error('权限验证失败:', error);
      
      // 测试模式：出错时也跳过权限检查
      if (TEST_MODE) {
        console.log('测试模式: 出错时跳过权限检查');
        return next();
      }
      
      return res.status(500).json({
        status: 'error',
        message: '权限验证失败',
        error: error.message
      });
    }
  };
};

/**
 * 验证用户是否有所有指定权限
 * @param {string|string[]} requiredPermissions - 需要的权限代码或权限代码数组
 * @returns {Function} Express中间件
 */
exports.hasAllPermissions = (requiredPermissions) => {
  return async (req, res, next) => {
    try {
      console.log('权限检查中间件(全部) - 所需权限:', requiredPermissions);
      
      // 测试模式：跳过权限检查
      if (TEST_MODE) {
        console.log('测试模式: 跳过权限检查');
        return next();
      }
      
      // 获取用户ID
      const userId = req.user?.id;
      
      if (!userId) {
        return res.status(401).json({
          status: 'error',
          message: '未认证的用户'
        });
      }
      
      // 查询用户及其角色和权限
      const user = await prisma.user.findUnique({
        where: { id: userId },
        include: {
          role: {
            include: {
              permissions: {
                include: {
                  permission: true
                }
              }
            }
          }
        }
      });
      
      if (!user) {
        return res.status(404).json({
          status: 'error',
          message: '用户不存在'
        });
      }
      
      // 判断用户状态
      if (!user.status) {
        return res.status(403).json({
          status: 'error',
          message: '用户已被禁用'
        });
      }
      
      // 获取用户权限代码
      const userPermissions = user.role?.permissions.map(p => p.permission.code) || [];
      console.log('用户权限:', userPermissions);
      
      // 将单个权限代码转换为数组
      const permissions = Array.isArray(requiredPermissions)
        ? requiredPermissions
        : [requiredPermissions];
      
      // 检查用户是否拥有通配符权限
      if (userPermissions.includes('*')) {
        // 将用户权限添加到请求对象中，以便后续使用
        req.permissions = userPermissions;
        return next();
      }
      
      // 检查用户是否拥有所有所需权限
      const hasAllRequiredPermissions = permissions.every(
        permission => userPermissions.includes(permission)
      );
      
      if (!hasAllRequiredPermissions) {
        return res.status(403).json({
          status: 'error',
          message: '没有足够权限执行此操作'
        });
      }
      
      // 将用户权限添加到请求对象中，以便后续使用
      req.permissions = userPermissions;
      
      next();
    } catch (error) {
      console.error('权限验证失败:', error);
      
      // 测试模式：出错时也跳过权限检查
      if (TEST_MODE) {
        console.log('测试模式: 出错时跳过权限检查');
        return next();
      }
      
      return res.status(500).json({
        status: 'error',
        message: '权限验证失败',
        error: error.message
      });
    }
  };
}; 